package com.powernode.order.controller;

import com.powernode.common.result.Result;
import com.powernode.model.entity.order.OrderInfo;
import com.powernode.model.form.order.OrderInfoForm;
import com.powernode.model.form.order.StartDriveForm;
import com.powernode.model.form.order.UpdateOrderBillForm;
import com.powernode.model.form.order.UpdateOrderCartForm;
import com.powernode.model.vo.order.CurrentOrderInfoVo;
import com.powernode.order.service.OrderInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

/**
 * 订单信息API控制器
 * 提供订单创建、状态查询、抢单等订单相关的RESTful接口
 */
@Tag(name = "订单API接口管理")
@RestController
@RequestMapping(value = "/order/info")
@SuppressWarnings({"unchecked", "rawtypes"})  // 抑制未检查类型转换和原始类型警告
public class OrderInfoController {
    @Resource
    private OrderInfoService orderInfoService;  // 订单业务逻辑层对象

    /**
     * 添加新订单接口
     *
     * @param orderInfoForm 订单信息表单对象（包含订单必要信息）
     * @return 统一响应结果，data为新创建的订单ID
     */
    @Operation(summary = "添加订单")  // Swagger注解：接口功能描述
    @PostMapping(value = "/addOrderInfo")
    public Result<Long> addOrderInfo(@RequestBody OrderInfoForm orderInfoForm) {
        // 调用服务层添加订单，将结果包装为统一响应格式返回
        return Result.ok(orderInfoService.addOrderInfo(orderInfoForm));
    }

    /**
     * 查询订单状态接口
     *
     * @param orderId 订单ID（路径参数）
     * @return 统一响应结果，data为订单状态码
     */
    @Operation(summary = "查询订单状态")  // Swagger注解：接口功能描述
    @GetMapping(value = "/getOrderStatus/{orderId}")
    public Result<Integer> getOrderStatus(@PathVariable Long orderId) {
        // 调用服务层查询订单状态，将结果包装为统一响应格式返回
        return Result.ok(orderInfoService.queryOrderStatus(orderId));
    }

    /**
     * 配送员抢单接口
     *
     * @param driverId 配送员ID（路径参数）
     * @param orderId  订单ID（路径参数）
     * @return 统一响应结果，data为抢单结果（布尔值）
     */
    @Operation(summary = "抢单")  // Swagger注解：接口功能描述
    @GetMapping("/robNewOrder/{driverId}/{orderId}")
    public Result<Boolean> robNewOrder(@PathVariable Long driverId, @PathVariable Long orderId) {
        // 调用服务层执行抢单逻辑，将结果包装为统一响应格式返回
        return Result.ok(orderInfoService.robNewOrder(driverId, orderId));
    }

    /**
     * 查询顾客当前订单接口
     *
     * @param customerId 顾客ID（路径参数）
     * @return 统一响应结果，data为顾客当前订单详情VO
     */
    @Operation(summary = "查找顾客当前订单")  // Swagger注解：接口功能描述
    @GetMapping("/searchCustomerCurrentOrder/{customerId}")
    public Result<CurrentOrderInfoVo> searchCustomerCurrentOrder(@PathVariable Long customerId) {
        // 调用服务层查询顾客当前订单，将结果包装为统一响应格式返回
        return Result.ok(orderInfoService.searchCustomerCurrentOrder(customerId));
    }

    /**
     * 查询配送员当前订单接口
     *
     * @param driverId 配送员ID（路径参数）
     * @return 统一响应结果，data为配送员当前订单详情VO
     */
    @Operation(summary = "查找配送员当前订单")  // Swagger注解：接口功能描述
    @GetMapping("/searchDriverCurrentOrder/{driverId}")
    public Result<CurrentOrderInfoVo> searchDriverCurrentOrder(@PathVariable Long driverId) {
        // 调用服务层查询配送员当前订单，将结果包装为统一响应格式返回
        return Result.ok(orderInfoService.searchDriverCurrentOrder(driverId));
    }

    /**
     * 根据订单id获取订单信息接口
     *
     * @param orderId 订单ID（路径参数）
     * @return 统一响应结果，data为订单信息实体对象
     */
    @Operation(summary = "根据订单id获取订单信息")
    @GetMapping("/getOrderInfo/{orderId}")
    public Result<OrderInfo> getOrderInfo(@PathVariable Long orderId) {
        return Result.ok(orderInfoService.getById(orderId));
    }

    /**
     * 配送员到达起始点
     *
     * @param orderId 订单ID
     * @param driverId 配送员ID
     * @return 配送员到达起始点结果
     */
    @Operation(summary = "配送员到达起始点")
    @GetMapping("/driverArriveStartLocation/{orderId}/{driverId}")
    public Result<Boolean> driverArriveStartLocation(@PathVariable Long orderId, @PathVariable Long driverId) {
        return Result.ok(orderInfoService.driverArriveStartLocation(orderId, driverId));
    }

    /**
     * 更新配送车辆信息
     *
     * @param updateOrderCartForm 更新配送车辆信息表单
     * @return 更新配送车辆信息结果
     */
    @Operation(summary = "更新配送车辆信息")
    @PostMapping("/updateOrderCart")
    public Result<Boolean> updateOrderCart(@RequestBody UpdateOrderCartForm updateOrderCartForm) {
        return Result.ok(orderInfoService.updateOrderCart(updateOrderCartForm));
    }

    /**
     * 配送员开始配送服务
     *
     * @param startDriveForm 开始配送服务表单
     * @return 配送员开始配送服务结果
     */
    @Operation(summary = "开始配送服务")
    @PostMapping("/startDrive")
    public Result<Boolean> startDrive(@RequestBody StartDriveForm startDriveForm) {
        return Result.ok(orderInfoService.startDrive(startDriveForm));
    }

    /**
     * 根据时间段获取订单数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 订单数
     */
    @Operation(summary = "根据时间段获取订单数")
    @GetMapping("/getOrderNumByTime/{startTime}/{endTime}")
    public Result<Long> getOrderNumByTime(@PathVariable String startTime, @PathVariable String endTime) {
        return Result.ok(orderInfoService.getOrderNumByTime(startTime, endTime));
    }

    /**
     * 配送员结束配送服务更新订单账单
     *
     * @param updateOrderBillForm 更新订单账单表单
     * @return 配送员结束配送服务更新订单账单结果
     */
    @Operation(summary = "结束配送服务更新订单账单")
    @PostMapping("/endDrive")
    public Result<Boolean> endDrive(@RequestBody UpdateOrderBillForm updateOrderBillForm) {
        return Result.ok(orderInfoService.endDrive(updateOrderBillForm));
    }
}

